home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 12984 / 12984.xpi / chrome / VideoDownloaderToolbar.jar / content / autofill.js < prev    next >
Text File  |  2010-01-29  |  6KB  |  221 lines

  1. if(!com) var com={};
  2. if(!com.VidBar) com.VidBar={};
  3.  
  4. com.VidBar.FieldRule = function(name, rule, value) {
  5.     this.name = name;
  6.     this.ruleRegExp = new RegExp(rule, 'i');
  7.     this.value = value;
  8.     return;
  9. }
  10.  
  11. com.VidBar.FieldRule.prototype = {
  12.     name : null,
  13.     ruleRegExp: null,
  14.     value: null,
  15.     isRuleMatching: function(str) {
  16.         // Test if the fieldRule matches the given string:
  17.         return this.ruleRegExp.test(str);
  18.     },
  19.     getValue: function(){
  20.         return this.value;
  21.     }
  22. }
  23.  
  24. com.VidBar.AutoFill = function() {
  25.     this.profile = new com.VidBar.Profile();
  26.     this.initProfile();
  27. }
  28.  
  29. com.VidBar.AutoFill.prototype = {
  30.     regExpFormFieldTypes : '^(?:(?:text(?:area)?))$',
  31.     regExpFormFieldTypeTester : null,
  32.     fieldRuleDefs : {
  33.         "firstname" : "(?:first\w*name)|(?:name\w*first)",
  34.         "middlename" : "(?:middle\w*name)|(?:name\w*middle)",
  35.         "lastname" : "(?:last\w*name)|(?:name\w*last)",
  36.         "email" : "mail",
  37.         "company" : "company",
  38.         "address1" : "(?:(?:street)|(?:addr))\w*1",
  39.         "address2" : "(?:(?:street)|(?:addr))\w*2",
  40.         "city" : "(?:city)|(?:town)",
  41.         "state" : "(?:state)|(?:prov)|(?:region)",
  42.         "zip" : "(?:zip)|(?:post\w*code)",
  43.         "country" : "country",
  44.         "phone" : "phone",
  45.         "fax" : "fax"
  46.     },
  47.     profile : null,
  48.     fieldRules : [],
  49.  
  50.     initProfile : function(){
  51.         this.profile.load();
  52.         this.fieldRules = [];
  53.         for(var i in this.fieldRuleDefs){
  54.             var rule = this.fieldRuleDefs[i];
  55.             var value = this.profile.fieldValues[i];
  56.             com.VidBar.__d("rule: "+rule);
  57.             com.VidBar.__d("value: "+value);
  58.             this.fieldRules.push(new com.VidBar.FieldRule(i, rule, value))
  59.         }
  60.     },
  61.     editProfile : function() {
  62.         var options = "chrome,centerscreen,modal";
  63.         window.openDialog("chrome://vidbar/content/EditProfile.xul",
  64.                 "BasicToolBar-EditProfile-Dialog", options, {});
  65.         //alert("reload");
  66.         this.initProfile();
  67.     },
  68.     autoFill: function() {
  69.         var doc;
  70.         if(content)
  71.             doc = content.document;
  72.         else
  73.             doc = gBrowser.contentDocument;
  74.         
  75.         // Check if any web forms are available on the current window:
  76.         if(doc && doc.forms && doc.forms.length > 0) {
  77.  
  78.              // Go through the forms:
  79.              for(var i = 0; i < doc.forms.length; i++) {
  80.                  // The form elements list:
  81.                 var elements = doc.forms[i].elements;
  82.                 
  83.                 // Go through the form elements:
  84.                 for(var j = 0; j < elements.length; j++) {                    
  85.                     // Fill out valid form field types:
  86.                     com.VidBar.__d("name: "+elements[j].name+" type: "+elements[j].type);
  87.                     if(this.isValidFormField(elements[j])) {
  88.                         this.setFormField(elements[j]);
  89.                     }
  90.                 }
  91.              }
  92.         }
  93.     },
  94.     isValidFormField: function(element) {
  95.         if(element.disabled) {
  96.             return false;
  97.         }
  98.         if(!this.regExpFormFieldTypeTester) {
  99.             this.regExpFormFieldTypeTester = new RegExp(
  100.                 this.regExpFormFieldTypes
  101.             );
  102.         }
  103.         return this.regExpFormFieldTypeTester.test(element.type);
  104.     },
  105.     setFormField: function(element) {
  106.         var labelValue = this.getLabelForElement(element);
  107.         com.VidBar.__d("label: "+labelValue);
  108.  
  109.         // Go through the list of fieldRules:
  110.         for(var i=0; i < this.fieldRules.length; i++) {
  111.             
  112.             var rule = this.fieldRules[i];
  113.             com.VidBar.__d("rule: "+rule.name);
  114.             
  115.             if((element.name && rule.isRuleMatching(element.name)) ||
  116.                 (labelValue && rule.isRuleMatching(labelValue)) ||
  117.                 (element.id && rule.isRuleMatching(element.id))){
  118.  
  119.                 com.VidBar.__d("matched");
  120.                 // Set the element:
  121.                 if(!element.value) {
  122.                     element.value = rule.getValue();
  123.                     break;
  124.                 }
  125.             }
  126.         }
  127.     },
  128.     getLabelForElement: function(element) {
  129.         if(element.form && element.id) {
  130.             // Method to retrieve the textual content of the label assigned to the form element:
  131.             var labels = element.form.getElementsByTagName('label');
  132.             for(var i=0; i<labels.length; i++) {
  133.                 if(labels[i].htmlFor && labels[i].htmlFor == element.id) {
  134.                     // label elements may contain other inline elements,
  135.                     // so we just use the innerHTML content and strip it of all HTML tags
  136.                     // whitespace is removed from the beginning and end of the string for convenience:
  137.                     return this.trim(this.stripTags(labels[i].innerHTML));
  138.                 }
  139.             }
  140.         }
  141.         return this.getLabelCloseToElement(element);
  142.     },
  143.     getLabelCloseToElement: function(element) {
  144.         var label = null;
  145.         var node = element;
  146.         var nextNode;
  147.         // For other elements the label is usually placed as previousSibling:
  148.         nextNode = 'previousSibling';
  149.         // Check if a sibling contains the element label:
  150.         while(node[nextNode]) {
  151.             node = node[nextNode];
  152.             label = this.getNodeTextContent(node, true);
  153.             if(label) {
  154.                 return label;
  155.             }
  156.         }
  157.         // Parse the siblings of the parentNode:
  158.         node = element.parentNode;
  159.         if(node) {
  160.             while(node[nextNode]) {
  161.                 node = node[nextNode];
  162.                 label = this.getNodeTextContent(node, true);
  163.                 if(label) {
  164.                     return label;
  165.                 }
  166.             }
  167.             // If the parentNode of the parentNode is a table cell,
  168.             // also parse the siblings of this node:
  169.             node = element.parentNode.parentNode;
  170.             if(node && node.nodeName == 'TD') {
  171.                 while(node[nextNode]) {
  172.                     node = node[nextNode];
  173.                     label = this.getNodeTextContent(node, true);
  174.                     if(label) {
  175.                         return label;
  176.                     }
  177.                 }
  178.             }
  179.         }
  180.         return null;
  181.     },
  182.     getNodeTextContent: function(node, trim) {
  183.         // Get the text content from the current node or its child nodes:
  184.         var text;        
  185.         if(node.nodeType == 3) {
  186.             // nodeType 3 is a text node:
  187.             text = node.nodeValue;
  188.         } else {
  189.             // Do not follow selection nodes, script nodes or noscript nodes:
  190.             if(node.nodeName == 'SELECT' || node.nodeName == 'SCRIPT' || node.nodeName == 'NOSCRIPT') {
  191.                 return '';
  192.             }
  193.             text = '';
  194.             for(var i=0; i<node.childNodes.length; i++) {
  195.                 text += this.getNodeTextContent(node.childNodes[i]);
  196.             }
  197.         }
  198.         if(trim) {
  199.             return this.trim(text);
  200.         } else {
  201.             return text;
  202.         }
  203.     },
  204.     stripTags: function(str) {
  205.         if (!arguments.callee.regExp) {
  206.             arguments.callee.regExp = new RegExp('<\\/?[^>]+?>', 'g');
  207.         }
  208.         // Return string stripped from HTML tags:
  209.         return str.replace(arguments.callee.regExp, '');
  210.     },
  211.     
  212.     trim: function(str) {
  213.         if (!arguments.callee.regExp) {
  214.             arguments.callee.regExp = new RegExp('(?:^\\s+)|(?:\\s+$)', 'g');
  215.         }
  216.         // Return string with whitespace removed at beginning and end of the string:
  217.         return str.replace(arguments.callee.regExp, '');
  218.     }
  219. };
  220.  
  221.